home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / util / batch / Randomcopy.lha / randomcopy.e < prev    next >
Encoding:
Text File  |  1993-12-23  |  4.9 KB  |  259 lines

  1.  
  2. /*      Randomcopy.e      COPYRIGHT 1993 by Chad Randall (crandall)  */
  3.  
  4.  
  5. MODULE 'dos/dos','dos/dosextens','dos/dosasl'
  6.  
  7. DEF argstr[500]:STRING
  8. DEF source[150]:STRING
  9. DEF dest[150]:STRING
  10. DEF work[150]:STRING
  11. DEF work2[150]:STRING
  12. DEF waittime=NIL
  13.  
  14. DEF pos,i,quietflag,cloneflag,posflag,error,fail,seconds,micros,random,dd
  15.  
  16. CONST AOK=69            /*  GRIN  8->  */
  17. CONST NOT_AOK=666  /*  Just a joke... or is it?  >:">  */
  18.  
  19. PROC main()
  20.  
  21.     IF KickVersion(37)=NIL
  22.         WriteF('\nGet OS2.x (maybe a nice A1200?)\n')
  23.         RETURN
  24.     ENDIF
  25.  
  26.  
  27.     CurrentTime({seconds},{micros})
  28.     
  29.     random:=RndQ(seconds)
  30.  
  31.     /* An attempt to get a pseudo-randomized number! */
  32.  
  33.     FOR i:=0 TO micros/1000
  34.         dd:=Rnd(i)
  35.     ENDFOR
  36.  
  37.  
  38.     StrCopy(argstr,arg,ALL)
  39.  
  40.     WHILE (pos:=parsenext(pos))
  41.         StrCopy(work2,work,ALL)
  42.         UpperStr(work2)
  43.         IF (StrCmp(work2,'QUIET',ALL))
  44.             quietflag:=TRUE
  45.         ELSE
  46.             IF (StrCmp(work2,'CLONE',ALL))
  47.                 cloneflag:=TRUE
  48.             ELSE
  49.                 IF (StrCmp(work2,'FROM',ALL))
  50.                     IF (pos:=parsenext(pos))
  51.                         StrCopy(source,work,ALL)
  52.                         posflag:=TRUE
  53.                     ELSE
  54.                         error:=15
  55.                     ENDIF
  56.                 ELSE
  57.                     IF (StrCmp(work2,'TO',ALL))
  58.                         IF (pos:=parsenext(pos))
  59.                             StrCopy(dest,work,ALL)
  60.                             posflag:=AOK
  61.                         ELSE
  62.                             error:=15
  63.                         ENDIF
  64.                     ELSE
  65.                         IF (StrCmp(work2,'?',ALL))
  66.                             commandline()
  67.                         ELSE
  68.                             IF (StrCmp(work2,'ABOUT',ALL))
  69.                                 instructions()
  70.                             ELSE
  71.                                 IF posflag=NIL
  72.                                     StrCopy(source,work,ALL)
  73.                                     posflag:=TRUE
  74.                                 ELSE
  75.                                     IF posflag=AOK
  76.                                         error:=15
  77.                                         posflag:=NOT_AOK
  78.                                     ELSE
  79.                                         StrCopy(dest,work,ALL)
  80.                                         posflag:=AOK
  81.                                     ENDIF
  82.                                 ENDIF
  83.                             ENDIF
  84.                         ENDIF
  85.                     ENDIF
  86.                 ENDIF
  87.             ENDIF
  88.         ENDIF
  89.     ENDWHILE
  90.  
  91.     IF (error) 
  92.         IF quietflag=NIL
  93.             WriteF('randomcopy: too many arguments\n')
  94.         ENDIF
  95.     ELSE
  96.         IF ((posflag=NIL) OR (posflag=TRUE))
  97.             IF quietflag=NIL
  98.                 WriteF('randomcopy: required argument missing\n')
  99.             ENDIF
  100.         ELSE    
  101.             IF (posflag=AOK)
  102.                 docopy()
  103.             ENDIF
  104.         ENDIF
  105.     ENDIF
  106.  
  107. ENDPROC error
  108.  
  109. PROC docopy()
  110.     DEF lock=NIL:PTR TO filelock,fileinfo=NIL:PTR TO fileinfoblock
  111.     DEF apath=NIL:PTR TO anchorpath,achain=NIL:PTR TO achain
  112.     DEF err,pathlen,filestart,first,chance=1
  113.  
  114.     filestart:=FilePart(source)
  115.     pathlen:=filestart-source
  116.     IF (pathlen)
  117.         StrCopy(work,source,pathlen)
  118.     ELSE
  119.         StrCopy(work,'',ALL)
  120.     ENDIF
  121.  
  122.     apath:=New(SIZEOF anchorpath)
  123. /*    fileinfo:=New(SIZEOF fileinfoblock) */
  124.  
  125.     err:=NIL;first:=FALSE
  126.     WHILE err=NIL
  127.         IF first=FALSE
  128.             err:=MatchFirst(source,apath)
  129.             first:=TRUE
  130.         ELSE
  131.             err:=MatchNext(apath)
  132.         ENDIF
  133.         IF (err)
  134.             IF (err=ERROR_NO_MORE_ENTRIES)
  135.                 IF chance>1
  136.                     copyfile()
  137.                 ELSE
  138.                     printerror(ERROR_NO_MORE_ENTRIES)
  139.                 ENDIF
  140.             ELSE
  141.                 printerror(err)
  142.             ENDIF
  143.         ELSE
  144.             achain:=apath.last
  145.             IF (achain)
  146.                 fileinfo:=achain.info
  147.                 IF (fileinfo.direntrytype)<0
  148.                     IF (fileinfo)
  149.                         IF(Rnd(chance))=NIL
  150.                             StrCopy(work2,fileinfo.filename,ALL)
  151.                         ENDIF
  152.                         chance:=chance+1
  153.                     ENDIF
  154.                 ENDIF
  155.             ENDIF
  156.         ENDIF
  157.     ENDWHILE
  158.  
  159.     MatchEnd(apath)
  160.  
  161. ENDPROC
  162.  
  163. PROC copyfile()
  164.     DEF    filesize,workfh=NIL:PTR TO filehandle,
  165.             destfh=NIL:PTR TO filehandle
  166.     DEF b,cont=FALSE,numbytes,buffer,numbytes2
  167.  
  168.     buffer:=New(512)
  169.     StrAdd(work,work2,ALL)
  170.     IF quietflag=NIL
  171.         WriteF('Copying \s TO \s\n',work,dest)
  172.     ENDIF
  173.     IF(filesize:=FileLength(work))>0
  174.         IF (workfh:=Open(work,MODE_OLDFILE))
  175.             IF (destfh:=Open(dest,MODE_NEWFILE))
  176.                 WHILE cont=FALSE
  177.                     numbytes:=Read(workfh,buffer,512)
  178.                     IF numbytes=-1
  179.                         printerror(b:=IoErr())
  180.                         cont:=TRUE
  181.                     ELSE
  182.                         IF numbytes=0
  183.                             cont:=TRUE
  184.                         ELSE
  185.                             numbytes2:=Write(destfh,buffer,numbytes)
  186.                             IF numbytes<512
  187.                                 cont:=TRUE
  188.                             ENDIF
  189.                         ENDIF
  190.                     ENDIF
  191.                 ENDWHILE                
  192.             ELSE
  193.                 printerror(b:=IoErr())
  194.             ENDIF
  195.         ELSE
  196.             printerror(b:=IoErr())
  197.         ENDIF
  198.     ELSE
  199.         printerror(b:=IoErr())
  200.     ENDIF
  201.     IF (destfh) THEN Close(destfh)
  202.     IF (workfh) THEN Close(workfh)
  203.  
  204. ENDPROC
  205.  
  206. PROC printerror(errn)
  207.     DEF ebuf[140]:STRING,head[100]:STRING,a
  208.  
  209.     StrCopy(head,'Randomcopy failed',ALL)
  210.     IF (a:=Fault(errn,head,ebuf,140))=NIL
  211.         WriteF('Randomcopy error.\n')
  212.     ELSE
  213.         IF quietflag=NIL
  214.             WriteF('\s\n',ebuf)
  215.         ENDIF
  216.     ENDIF
  217. ENDPROC
  218.  
  219. PROC commandline()
  220.     IF quietflag=NIL
  221.         WriteF('\nFROM\\A TO\\A QUIET\\S CLONE\\S ABOUT\\S\n')
  222.     ENDIF
  223. ENDPROC
  224.  
  225. PROC instructions()
  226.     IF quietflag=NIL
  227.         WriteF('\nRandomcopy  version .5  December 22, 1993.\n')
  228.         WriteF('This program is copyright ®1993 by Chad Randall\n')
  229.         WriteF('and may be freely distributed.\n')
  230.         WriteF('\n')
  231.         WriteF('  EMAIL:crandall@garnet.msen.com\n')
  232.         WriteF(' USNAIL:Chad Randall, 229 S.Washington St.,\n')
  233.         WriteF('        Manchester, Michigan 48158-9680, USA.\n')
  234.         WriteF('\n')
  235.  
  236.     ENDIF
  237. ENDPROC
  238.  
  239. PROC parsenext(x)
  240.     DEF lpos,lastpos
  241.     FOR lpos:=x TO StrLen(argstr)
  242.         MidStr(work,argstr,lpos,1)
  243.         IF ((StrCmp(work,' ',ALL)) OR (lpos=StrLen(argstr)))
  244.             MidStr(work,argstr,x,lpos-x)
  245.             lastpos:=lpos
  246.             lpos:=2000
  247.         ENDIF
  248.     ENDFOR
  249.     IF (lpos<2000)
  250.         lpos:=0
  251.     ELSE
  252.         lpos:=lastpos+1
  253.     ENDIF
  254. ENDPROC lpos
  255.  
  256. PROC version()
  257.     WriteF('\n$VER: randomcopy 0.51 (23.12.93)\n')
  258. ENDPROC
  259.